from sqlmodel import Session, select, and_, or_
from fastapi import Query
from typing import Annotated, Optional
import models
import utility
from common import exception
from datetime import datetime
from dependencies import engine, SessionDep

"""查询当前用户拥有权限的全部菜单

Keyword arguments:
None
Return: user_org -- 当前用户拥有权限的全部菜单
"""


def get_user_access_org(
    user: models.SystemUser = None, session: SessionDep = Session(engine),
):
    # 查询全部的有效组织机构
    system_org = session.exec(
        select(models.SystemOrg)
        .where(models.SystemOrg.is_active == True)
        .order_by(models.SystemOrg.order)
    ).all()

    if user.org_id:
        # 获取当前机构信息
        user_org = dict(session.get(models.SystemOrg, user.org_id))

        # 获取数据可以访问的组织机构id列表
        org_ids = utility.general.get_node_ids(system_org, user.org_id)
        print(f"当前用户机构id: {org_ids}")

        # 查询用户拥有权限的组织机构
        access_orgs = session.exec(
            select(models.SystemOrg)
            .where(models.SystemOrg.id.in_(org_ids))
        ).all()


        # 将当前机构信息转换为列表
        user_org["children"] = utility.general.build_tree_recursive(
            access_orgs, parent_id=user.org_id)
        
        # 将当前机构信息转换为列表
        user_org = [user_org]
        
    else:
        # 如果当前用户机构id为空，获取全部机构（超级管理员）
        user_org = utility.general.build_tree_recursive(system_org, parent_id=None)
    return user_org


"""查询组织机构详情

Keyword arguments:
name -- 组织机构名称
code -- 组织机构编码
is_active -- 是否有效（default True）
Return: org -- 组织机构详情
"""


def get_org(
    name: str = None,
    code: str = None,
    is_active: bool = True,
    user: models.SystemUser = None,
    session: SessionDep = Session(engine),
):
    system_org = session.exec(
        select(models.SystemOrg).where(
            and_(
                models.SystemOrg.name == name if name else True,
                models.SystemOrg.code == code if code else True,
                models.SystemOrg.is_active == is_active,
            )
        )
    ).one_or_none()
    return system_org


"""新增组织机构

Keyword arguments:
org -- 新增组织机构参数
Return: return_description
"""


def create_org(
    org: models.SystemOrgCreate,
    user: models.SystemUser = None,
    session: SessionDep = Session(engine),
):
    # 新增组织机构
    system_org = models.SystemOrg(
        **dict(org),
        create_id=user.id,
        update_id=user.id,
        createtime=datetime.now(),
        updatetime=datetime.now()
    )
    session.add(system_org)
    session.commit()
    session.refresh(system_org)
    return system_org


"""编辑组织机构

Keyword arguments:
org -- 编辑组织机构参数
Return: org -- 组织机构详情
"""


def update_org(
    id: int,
    org: models.SystemOrgUpdate,
    user: models.SystemUser = None,
    session: SessionDep = Session(engine),
):
    # 查询组织机构数据
    system_org = session.get(models.SystemOrg, id)

    # 更新组织机构数据
    system_org.name = org.name
    system_org.code = org.code
    system_org.parent_id = org.parent_id
    system_org.order = org.order
    system_org.is_active = org.is_active
    system_org.notes = org.notes
    system_org.update_id = user.id
    system_org.updatetime = datetime.now()

    # 提交数据
    session.commit()
    session.refresh(system_org)
    return system_org


"""删除组织机构

Keyword arguments:
id -- 组织机构id
Return: org -- 组织机构详情
"""


def delete_org(
    id: int,
    user: models.SystemUser = None,
    session: SessionDep = Session(engine),
):
    # 查询组织机构数据
    system_org = session.get(models.SystemOrg, id)

    # 删除组织机构数据
    session.delete(system_org)
    session.commit()
    return system_org
